package com.jf.cloud.service.sysmanager.remote;


import java.sql.Timestamp;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jf.cloud.service.sysmanager.common.base.AjaxPageData;
import com.jf.cloud.service.sysmanager.common.base.OPaging;
import com.jf.cloud.service.sysmanager.common.db.Query;
import com.jf.cloud.service.sysmanager.common.util.JsonUtil;
import com.jf.cloud.service.sysmanager.dao.ISysRoleService;
import com.jf.cloud.service.sysmanager.dao.ISysRoleTypeService;
import com.jf.cloud.service.sysmanager.entity.SysRole;
import com.jf.cloud.service.sysmanager.entity.SysStaff;
import com.jf.cloud.service.sysmanager.support.web.BaseController;

import net.sf.json.JSONArray;

/**
 * 角色 控制器
 * 
 * @author 朱建文 创建时间：2017年12月5日 下午6:52:36
 */
@Controller
@RequestMapping("/role")
public class RoleController extends BaseController{
	private static Logger log = LoggerFactory.getLogger(RoleController.class);
    
	@Resource
	private ISysRoleService  roleService;
	
	@Resource
	private ISysRoleTypeService roleTypeService;
	
	/**
	 * 获取角色列表
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午6:52:50
	 */
	@RequestMapping("/list")
	public String roleList(HttpServletRequest request) {
		try {
			Integer flag = this.getIntValue(request, "flag");
			if (Integer.valueOf(1).equals(flag)) {
				request.setAttribute("msg", "添加成功");
			}
			String staffType = getLoginUser(request).getStaffType();
			SysRole role = roleService.findByPK(Long.valueOf(staffType));
			request.setAttribute("currRoleType", role.getRoleType());
			
			// 角色类型列表
			List<Map<String, Object>> roleTypeList = this.roleTypeService.findDataDictList(true);
			request.setAttribute("roleTypeList", JsonUtil.toJSON(roleTypeList));
		} catch (Exception e) {
			log.error("获取角色列表出错!", e);
		}
		return "jsp/system/role_list";
	}
	
	/**
	 * 获取列表
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午7:54:26
	 */
	@RequestMapping("/role.json")
	@ResponseBody
	public AjaxPageData<SysRole> list(HttpServletRequest request, OPaging<SysRole> page) {
		Map<String, Object> wm = page.getWm();
		wm.put("DEL_FLAG", 0);
		return getAjaxPageData(roleService.findPage(page));
	}
	
	/**
	 * 角色编辑
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午7:54:09
	 */
	@RequestMapping("/roleEditer")
	public String roleEditer(HttpServletRequest request, HttpServletResponse response) {
		Long id = getLongValue(request, "rowId");
		SysRole roleEdit = null;
		if (id != null && id > 0) {
			roleEdit = roleService.findByPK(id);
		}
		request.setAttribute("roleEdit", roleEdit);
		
		// 角色类型列表
		List<Map<String, Object>> roleTypeList = this.roleTypeService.findDataDictList(false);
		request.setAttribute("roleTypeList", roleTypeList);
		return "jsp/system/role_editer";
	}
	
	/**
	 * 添加角色
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午7:54:38
	 */
	@RequestMapping("/saveRole")
	public String saveRole(HttpServletRequest request, SysRole roleEdit) {
		if (isReCommit(request)) {
			return "redirect:/role/list?flag=1";
		}
		String returnView = roleList(request);
		request.setAttribute("code", 1);
		SysStaff user = getLoginUser(request);
		roleEdit.setOptTime(new Timestamp(System.currentTimeMillis()));
		roleEdit.setOptId(user.getRowId());
		roleEdit.setOptAccount(user.getStaffAccount());
		try {
			if (roleEdit.getRowId() == null || roleEdit.getRowId() == 0) {
				roleEdit.setDelFlag(0);//默认未删除
				roleEdit.setCreateId(user.getRowId());
				roleEdit.setCreateAccount(user.getStaffAccount());
				roleEdit.setCreateTime(new Timestamp(System.currentTimeMillis()));
				this.roleService.saveObj(roleEdit);
				request.setAttribute("msg", "添加角色成功!");

			} else {
				this.roleService.updateRole(roleEdit);
				request.setAttribute("msg", "修改角色成功!");

			}
		} catch (Exception e) {
			log.error("saveRole ---------> has error",e);
			request.setAttribute("msg", "添加失败,未知错误!");
			return returnView;
		}
		return returnView;
	}
	 
 	
	/**
	 * 删除角色
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午7:54:48
	 */
	@RequestMapping("/roleDelete")
	@ResponseBody
	public String roleDelete(HttpServletRequest request,HttpServletResponse response) {
		String result = "0";
		Long id = getLongValue(request, "rowId");
		SysStaff user = getLoginUser(request);
		try {
			this.roleService.deleteRole(id,user);

		} catch (Exception e) {
			log.error("删除角色失败", e);
			result = "-1";
		}
		return result;
	}
	
	/**
	 * 显示角色权限列表
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午7:54:57
	 */
	@RequestMapping("/showMenuRole")
	public String showMenuRole(HttpServletRequest request,Long id){
		//获取当前登录人
		SysStaff user = getLoginUser(request);
		String currId = user.getStaffType();
		if (SYS_ADMIN.equals(user.getStaffAccount())) {
			currId = SYS_ADMIN_ID;
		}
		List<Map<String, Object>> menus = roleService.getMenuListByTree(id,currId);
		request.setAttribute("menus", JSONArray.fromObject(menus).toString() );
		request.setAttribute("roleId", id);
 		return "jsp/system/menu_role_list";
	}
	
	/**
	 * 保存角色和菜单关系
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午7:55:08
	 */
	@RequestMapping("/updateAuthority")
	public String updateAuthority(HttpServletRequest request,Long roleId,String menuIds){
		
		SysStaff user = getLoginUser(request);
		try { 
			roleService.updateAuthority(roleId,menuIds,user);
			request.setAttribute("msg", "保存角色和菜单关系成功!");
			request.setAttribute("code", 1);

		} catch (Exception e) {
			log.error("updateAuthority error ", e);
			request.setAttribute("msg", "保存失败,未知错误!");
			request.setAttribute("code", 1);
		}
		return roleList(request);
	}
	
	/**
	 * 获取洪湖角色下拉框
	 * 
	 * @author 朱建文 创建时间：2017年12月5日 下午7:55:20
	 */
	@ResponseBody
	@RequestMapping("/role_dict")
	public List<Map<String,Object>> roleDict(OPaging<SysRole> page){
		
		Map<String, Object> wm = page.getWm();
		wm.put("DEL_FLAG", "0");
		Query query = new Query();
		for (Map.Entry<String, Object> e : wm.entrySet()) { 
			query.put(e.getKey(), e.getValue()); 
		}
		return this.roleService.findForTags("ROLE_NAME", "ROW_ID", query);
	}
	
}
